package com.kgc.sbt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.kgc.sbt.api.CartApi;
import com.kgc.sbt.service.OrderService;
import com.kgc.sbt.beans.*;
import com.kgc.sbt.utils.RequestResult;
import com.kgc.sbt.utils.ResultBuildUtil;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * Created on 2021/6/22.
 * Description:购物车
 */
@RestController
@Api(tags = "6 购物车操作入口")
@Slf4j
public class CartController {

    @Reference
    private CartApi cartApi;

    @Autowired
    private OrderService orderService;


    /**
     * 查询购物车详情
     */
    @GetMapping("/queryCart")
    @ApiOperation(value = "查询购物车详情", notes = "支持统一返回。。。")
    public RequestResult<List<ShoppingCartForm>> queryById(HttpServletRequest request) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("token_error_null", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("token_error_illegal", "用户标识token非法");
        }

        List<ShoppingCartForm> carts = cartApi.selectCartByUserId(userId);

        if (carts.isEmpty()) {
            return ResultBuildUtil.fail("1005", "该用户未添加任何商品");
        }

        return ResultBuildUtil.success(carts);
    }

    /**
     * 添加商品到购物车
     */
    @GetMapping("/addCart")
    @ApiOperation(value = "添加商品到购物车", notes = "支持统一返回")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "productId", required = true, value = "商品ID"),
            @ApiImplicitParam(name = "quantity", required = true, value = "数量")
    })
    @ApiResponses({
            @ApiResponse(code = 8546, message = "用户标识token为空"),
            @ApiResponse(code = 1003, message = "用户不存在"),
            @ApiResponse(code = 1001, message = "用户未登录"),
            @ApiResponse(code = 4568, message = "用户标识token非法")
    })
    public RequestResult<String> insertCart(HttpServletRequest request, Integer productId, Integer quantity) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("8546", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("4568", "用户标识token非法");
        }

        // 查询用户信息
        UserLogin user = cartApi.selectUserById(userId);

        // 判断是否存在用户
        if (ObjectUtils.isEmpty(cartApi.selectUserById(userId))) {
            return ResultBuildUtil.fail("1003", "用户不存在");
        }

        // 判断用户是否登录   //
        if (user.getUserStatus() == 1 || user.getUserStatus() == null) {
            return ResultBuildUtil.fail("1001", "用户未登录");
        }

        if (ObjectUtils.isEmpty(cartApi.selectCartById(userId, productId))) {
            cartApi.addShopcart(userId, productId, quantity);
            return ResultBuildUtil.success("添加购物车成功");
        } else {
            cartApi.updateCartNumber(userId, productId, quantity);
            return ResultBuildUtil.success("添加购物车成功");
        }


    }

    /**
     * 更改购物车商品数量
     */
    @GetMapping("/updateQuantity")
    @ApiOperation(value = "更改购物车商品数量", notes = "支持统一返回。。。")
    public RequestResult<String> updateQuantity(HttpServletRequest request, @RequestParam Integer productId, @RequestParam Integer quantity) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("token_error_null", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("token_error_illegal", "用户标识token非法");
        }

/*        Product product=cartApi.selectGoodsById()
        //查询库存
        Stock stock = cartApi.selectStockById();

        // 判断商品库存是否充足
        if (quantity>stock.getCount()){
            return ResultBuildUtil.fail("1002","库存不足，请减少购买数量");
        }*/

        if (cartApi.updateCartQuantity(userId, productId, quantity)) {
            return ResultBuildUtil.success("修改数据成功");
        }

        return ResultBuildUtil.fail();
    }

    /**
     * 删除购物车里选中的商品
     */
    @GetMapping("/deleteCartByCarId")
    @ApiOperation(value = "删除购物车商品", notes = "支持统一返回。。。")
    public RequestResult<String> deleteCartByCarId(HttpServletRequest request, @RequestParam Integer productId) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("token_error_null", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("token_error_illegal", "用户标识token非法");
        }

        if (cartApi.delCartByCarId(userId, productId)) {
            return ResultBuildUtil.success("删除该商品成功");
        }

        return ResultBuildUtil.fail();
    }

    /**
     * 清空购物车里选中的商品
     */
    @GetMapping("/deleteCartByUserId")
    @ApiOperation(value = "清空购物车中商品", notes = "支持统一返回。。。")
    public RequestResult<String> deleteCartByUserId(HttpServletRequest request) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("token_error_null", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("token_error_illegal", "用户标识token非法");
        }

        if (cartApi.delCartByUserId(userId)) {
            return ResultBuildUtil.success("清空购物车成功");
        }

        return ResultBuildUtil.fail();
    }

    /**
     * 全选购物车里中商品
     */
    @GetMapping("/checkAll")
    @ApiOperation(value = "取消全选和全选购物车", notes = "支持统一返回。。。")
    @ApiResponses({
            @ApiResponse(code = 8546, message = "用户标识token为空"),
            @ApiResponse(code = 4568, message = "用户标识token非法")
    })
    public RequestResult<String> checkAll(HttpServletRequest request) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("8546", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("4568", "用户标识token非法");
        }

        return ResultBuildUtil.success(cartApi.checkAllByUserId(userId));

    }

    /**
     * 选中购物车中单个商品
     */
    @GetMapping("/checkSome")
    @ApiOperation(value = "选中购物车中单个商品", notes = "支持统一返回。。。")
    public RequestResult<String> checkSome(HttpServletRequest request, @RequestParam Integer productId) {

        // 获取用户标识的token
        String token = request.getHeader("token");

        if (token == null) {
            log.error("------ 用户标识token为空 ------");
            return ResultBuildUtil.fail("token_error_null", "用户标识token为空");
        }

        // 根据token获取用户id
        Integer userId = orderService.selectIdByToken(token);
        // 判断用户id是否合法
        if (userId == 0) {
            log.error("------ token非法，无法识别用户 ------");
            return ResultBuildUtil.fail("token_error_illegal", "用户标识token非法");
        }

        return ResultBuildUtil.success(cartApi.checkSomeByCartId(userId,productId));
    }


}
